package com.yc.thread;

/*
1. 函数式接口中只能有一个抽象方法（我们在这里不包括与Object的方法重名的方法）；
2. 可以有从Object继承过来的抽象方法，因为所有类的最终父类都是Object；
3. 接口中唯一抽象方法的命名并不重要，因为函数式接口就是对某一行为进行抽象，主要目的就是支持Lambda表达式
 */
@FunctionalInterface
interface Action<T> {
    void execute(T t);
}

/**
 * @program: concurrent
 * @description: 函数式编程语法的一个理解
 * @author: zy
 * @create: 2022-01-10 12:04
 */
public class Test11_function {

    public static void main(String[] args) {
        //外部类
        Action action3=new MyAction();
        action3.execute("haha ");
        //匿名内部类
        Action action4=new Action(){
            @Override
            public void execute(Object o) {
                System.out.println(    o );
            }
        };
        action4.execute("你好啊");




        //lambda语法
        Action action2=(t)->{
            //处理...
            System.out.println(   t );
        };
        action2.execute(  "bye");

        //直接绑定
        Action action = System.out::println;     //  System.out.println(   1  );
        action.execute("Hello World!");

        //作为参数用.
        test(System.out::println, "Hello World!");
    }

    static void test(Action action, String str) {
        action.execute(str);
    }
}

class MyAction implements Action{
    @Override
    public void execute(Object o) {
        System.out.println(    o );
    }
}